package com.wjm.servlet;

import com.wjm.http.HttpRequest;
import com.wjm.http.HttpResponse;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * Data:2022年08月25日
 * Author:wjm
 * Content:
 */
public abstract class ServerServlet {
    public abstract void service(HttpResponse response, HttpRequest request);

    //用来存储请求路径和具体的servlet的对应关系
    private static Map<String,ServerServlet> map = new HashMap<>();

    //为map集合赋值
    static {
        initMap();
    }


    /**
     * 初始化map集合的方法
     */
    private static void initMap(){
        try {
            //解析xml文件
            Document document = Jsoup.parse(new File("./config/servlet.xml"),"utf-8");

            //获取元素集合
            Elements elements = document.getElementsByTag("servlet");

            //遍历elements集合
            for (Element element:elements){
                //获取url标签对象
                Elements url = element.getElementsByTag("url");
                //通过url标签对象获取该标签的文本内容
                String text1 = url.text();
                System.out.println(text1);

                //获取classname标签对象
                Elements classname = element.getElementsByTag("classname");
                //通过标签对象，获取标签内的文本内容
                String text2 = classname.text();
                System.out.println(text2);

                //通过全类名获取类对象
                Class c = Class.forName(text2);
                //通过类对象来创建具体对象
                Object object = c.newInstance();
                //强转
                ServerServlet servlet = (ServerServlet) object;

                //将text1，和servlet存入map集合
                map.put(text1,servlet);
            }

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }


    /**
     * 通过传入的路径，反馈对应的servlet对象
     * @param url 传入的路径
     * @return 返回对应的servlet对象
     */
    public static ServerServlet getServlet(String url){
        return map.get(url);
    }

}
